<?php
/**

 //  [DoYouHaoBaby!] Init APP - wedoit
 //  +---------------------------------------------------------------------
 //
 //  “Copyright”
 //  +---------------------------------------------------------------------
 //  |(C)2010 - 2099 http://doyouhaobaby.net All rights reserved.
 //  | This is not a free software, use is subject to license terms
 //  +---------------------------------------------------------------------
 //
 //  “About This File”
 //  +---------------------------------------------------------------------
 //  | Task 模型
 //  +---------------------------------------------------------------------

*/

!defined('DYHB_PATH')&& exit;

class TaskModel extends Model{

	/**
	 * 返回对象的定义
	 *
	 * @access public
	 * @static
	 * @return array
	 */
	static public function init__(){
		return array(
		/**
		 * 用什么数据表保存对象
		 *
		 * < 数据库表不带前缀 >
		 *
		 * @return string
		 */
		'table_name'=>'task',

		/**
		 * 指定数据表记录字段与对象属性之间的映射关系
		 *
		 * < 指示模型中各个属性、关联的设置
		 *   没有在这里指定设置的数据表字段自动成为模型的普通属性。
		 *   例如数据表中有 user_id、user_title 两个字段，而 props 中
		 *  没有指定 user_title 属性的设置，则 user_title 字段成为该模型的 user_title 属性，并且可以读写。>
		 *
		 * @return array
		 */
		'props'=>array(
			// 主键应该是只读，确保领域对象的“不变量”
			'task_id'=>array('readonly'=>true),
			'user'=>array(Db::BELONGS_TO=>'UserModel','target_key'=>'user_id'),
		),

		/**
		 * 拒绝使用 mass-assignment 方式赋值的属性
		 *
		 * < 功能同上，如果上面是白名单的话，那么下面这个就是黑名单。
		 *   这里设置了属性，那么设置后的属性不能通过构造函数来赋值。 >
		 *
		 * @return mixed
		 */
		'attr_protected'=>'task_id',

		/**
		 * 指定在数据库中创建或者对象时，哪些属性的值由下面指定的内容进行覆盖（自动填充）
		 *
		 * @return array
		 */
		'autofill'=>array(
			array('task_is_completed',0,'create'),
		),

		/**
		 * 在保存对象时，会按照下面指定的验证规则进行验证。验证失败会发送错误，我们可以通过系统提供的方法拦截。
		 *
		 * < 除了在保存时自动验证，还可以通过对象的 模型::M()->check() 方法对数组数据进行验证。
		 *	系统提供了50多个验证规则，所有验证规则可以在 DoYouHaoBaby 完全开发手册中 ~handbook\package\check\check.html中全部罗列出来。 >
		 *
		 * < 如果需要添加一个自定义验证，应该写成 >
		 * < 'title'=>array(
		 *
		 *   array(array(__CLASS__,'checkTitle'),'标题不能为空'),
		 *) >
		 *
		 * < 同时上面的验证规则，可以用基于ThinkPHP的验证规则做到，下面我们将会有实例来做。>
		 *
		 * @return array
		 */
		'check'=>array(
			'task_subject'=>array(
				array('require','任务主题不能为空'),
				array('max_length',200,'任务主题不能超过 200 个字符'),
			),
			'task_description'=>array(
				array('require','任务描述不能为空'),
			),
		),
		);
	}

	/**
	 * 开启一个查询，查找符合条件的对象或对象集合
	 *
	 * @static
	 * @return DbSelect
	 */
	static function F(){
		$arrArgs=func_get_args();
		return ModelMeta::instance(__CLASS__)->findByArgs($arrArgs);
	}

	/**
	 * 返回当前 Model 类的元数据对象
	 *
	 * @static
	 * @return ModelMeta
	 */
	static function M(){
		return ModelMeta::instance(__CLASS__);
	}

	/**
	 * 明确修改任务的状态
	 *
	 * @param int $nCompleted
	 *
	 * @return TaskModel
	 */
	public function completed($nCompleted){
		$nCompleted=(int)$nCompleted;
		$this->changePropForce('task_is_completed',$nCompleted);
		return $this;
	}

}

